package com.naotebuk.bean;

import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import com.naotebuk.dao.ClienteDAO;
import com.naotebuk.dao.ConsertoDAO;
import com.naotebuk.entity.Cliente;
import com.naotebuk.entity.Conserto;
import com.naotebuk.enums.FormaDePagamento;
import com.naotebuk.enums.StatusConserto;
import com.naotebuk.utils.EMailUtil;
import com.naotebuk.vo.FiltroConsertoVO;

@ManagedBean
@SessionScoped
public class ConsertoManagedBean extends GenericManagedBean {

	// fields
	private Conserto conserto;
	private List<Conserto> consertos;
	private FiltroConsertoVO filtro;
	
	// constructors
	public ConsertoManagedBean(){
		filtro = new FiltroConsertoVO();
	}
	
	// public methods
	public void salvar() {
		if (ConsertoDAO.save(conserto)) {
//			consertos.add(conserto);
			addInfoMessage("Conserto salvo com sucesso.");
			RequestContext.getCurrentInstance().execute("dlgEdicao.hide()");
		} else 
			addErrorMessage("Não foi possível salvar o conserto.");
	}
	public void concluirConserto() throws SQLException {
		if (conserto == null || conserto.getIdConserto() == 0) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conserto", "Conserto não selecionado.");
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return;
		}
		conserto.setDataConclusao(new Date());
		if (!ConsertoDAO.save(conserto)) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conserto", "Não foi possível salvar o conserto.");
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return;
		}
		enviaEmailConserto(conserto);
		addInfoMessage("E-mail enviado com sucesso.");
		RequestContext.getCurrentInstance().execute("dlgConclusaoConserto.hide()");
	}
	public void realizarPagamentoConserto() throws SQLException {
		if (conserto == null || conserto.getIdConserto() == 0) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conserto", "Conserto não selecionado.");
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return;
		}
		if (!ConsertoDAO.save(conserto)) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conserto", "Não foi possIvel salvar o conserto.");
			FacesContext.getCurrentInstance().addMessage(null, msg);
			return;
		}
		RequestContext.getCurrentInstance().execute("dlgModalPagamento.hide()");
	}
	public StatusConserto[] listaStatusConserto() {
		return StatusConserto.values();
	}
	public List<StatusConserto> getListaDeStatusDeConsertos() {
		List<StatusConserto> result = new ArrayList<StatusConserto>();
		result.add(StatusConserto.TODOS);
		result.add(StatusConserto.EM_ABERTO);
		if (getUsuarioLogado().isGerente()) {
			result.add(StatusConserto.EM_ATRASO);
			result.add(StatusConserto.A_SER_RETIRADO);
			//result.add(StatusConserto.FINALIZADO);
		}
		return result;
	}
	public List<FormaDePagamento> getFormasDePagamento() {
		return Arrays.asList(FormaDePagamento.values());
	}
	public String pesquisaConserto() {
		try {
			consertos = ConsertoDAO.getConsertos(filtro);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	public String novoConserto() {
		this.conserto = new Conserto();
		this.conserto.setDataEntrada(new Date());
		this.conserto.setDataPrevisaoEntrega(new Date());
		System.out.println("Novo conserto" );
		return "";
	}
	public List<Cliente> completaNome(String cpf) {
		return ClienteDAO.buscaPorCpfParecido(cpf);
	}
	public void selecionaConserto(Conserto c) {
		this.conserto = c;
	}
	public void excluirConserto() {
		System.out.println("Excluindo conserto..." + conserto.getIdConserto());
		try {
			if (ConsertoDAO.delete(conserto)) {
				consertos.remove(conserto);
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Conserto", "Conserto excluído com sucesso.");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			} else {
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conserto", "Erro ao excluir conserto.");
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public String getTotalOrcadoFormatted() {
		double result = 0;
		if (this.consertos != null) {
			for (Conserto conserto : consertos) {
				result += conserto.getValorOrcado();
			}
		}
		DecimalFormat fmt = new DecimalFormat("R$ 0.00");      
		return fmt.format(result);
	}
	public String getTotalPagamentoFormatted() {
		double result = 0;
		if (this.consertos != null) {
			for (Conserto conserto : consertos) {
				result += conserto.getValorPagamento();
			}
		}
		DecimalFormat fmt = new DecimalFormat("R$ 0.00");      
		return fmt.format(result);
	}
	
	// private methods
	private void enviaEmailConserto(Conserto conserto) throws SQLException {
		String destinatario = conserto.getCliente().getEmail();
		String assunto = "NAOTEBUK - Seu conserto foi conclu�do";
		StringBuilder texto = new StringBuilder();
		texto.append("Olá " + conserto.getCliente().getNome() + ",");
		texto.append("\n\n");
		texto.append("O conserto número " + conserto.getIdConserto() + " foi concluído.");
		texto.append("\nPode retirar seu equipamento em nossa loja.");
		texto.append("\n\n");
		texto.append("Equipe NAOTEBUK");
		
		EMailUtil email = new EMailUtil();
		email.sendMail(destinatario, assunto, texto.toString());
	}

	// getters
	public Conserto getConserto() {
		return conserto;
	}
	public List<Conserto> getConsertos() throws SQLException {
		if (consertos == null)
			consertos = ConsertoDAO.getConsertos(filtro);
		return consertos;
	}
	public FiltroConsertoVO getFiltro() {
		return filtro;
	}

	// setters
	public void setConserto(Conserto conserto) {
		this.conserto = conserto;
	}
	
}
